package ebcs.scan.common.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.regex.Pattern;

public class DoubleUtil {
	
	/**
	 * d1>d2 return 1
	 * d1<d2 return -1
	 * d1 = d2 return 0
	 * @param d1
	 * @param d2
	 * @return
	 */
	public static int cmpDouble(double d1,double d2){
		BigDecimal data1 = new BigDecimal(d1); 
		BigDecimal data2 = new BigDecimal(d2);
		return data1.compareTo(data2);
	}
	
	/**
	* * 两个Double数相减 *
	* 
	* @param v1 *
	* @param v2 *
	* @return Double
	*/
	public static Double sub(Double d1, Double d2) {
	   BigDecimal b1 = new BigDecimal(d1.toString());
	   BigDecimal b2 = new BigDecimal(d2.toString());
	   return new Double(b1.subtract(b2).doubleValue());
	}
	
	/**
	* * 两个Double数相加 *
	* 
	* @param v1 *
	* @param v2 *
	* @return Double
	*/
	public static Double add(Double d1, Double d2) {
	   BigDecimal b1 = new BigDecimal(d1.toString());
	   BigDecimal b2 = new BigDecimal(d2.toString());
	   return new Double(b1.add(b2).doubleValue());
	}
	
	/**
	* * 两个Double数相乘 *
	* 
	* @param v1 *
	* @param v2 *
	* @return Double
	*/
	public static Double multiply(Double d1, Double d2) {
	   BigDecimal b1 = new BigDecimal(d1.toString());
	   BigDecimal b2 = new BigDecimal(d2.toString());
	   return new Double(b1.multiply(b2).doubleValue());
	}
	
	/**
	* * 两个Double数相除*
	* 
	* @param v1 *
	* @param v2 *
	* @return Double
	*/
	public static Double divide(Double d1, Double d2) {
	   BigDecimal b1 = new BigDecimal(d1.toString());
	   BigDecimal b2 = new BigDecimal(d2.toString());
	   return new Double(b1.divide(b2).doubleValue());
	}
	
	/**
	 * 校验格式是否合法
	 * @param money
	 * @return
	 */
	public static boolean checkMoney(String money){
		String patternStr = "^(([1-9]\\d{0,9})|0)(\\.\\d{1,2})?$";
		return  Pattern.matches(patternStr,money); 
	}
	
	 /**
	  * 四舍五入并保留两位小数
	 * @param money
	 * @return
	 */
	public static double roundMath(String money) {  
		 BigDecimal bg = new BigDecimal(money);  
         double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();   
         return f1;
     }
	
	/**
	 * @描述：不进行四舍五入保留小数位数
	 * @作者：包新钊
	 * @时间：2016年12月26日 下午10:24:27
	 * @param number 初始值
	 * @param scale 左右移小数点位数，例如（100，10，1，0.1），大于1左移，小于1右移，1不动
	 * @param points 保留小数位数
	 * @return
	 */
	public static String scaleNumberToStr(double number, double scale, int points)
	{
		boolean flag = (number < 0);
		number = Math.abs(number);
		String result = "";
		DecimalFormat nbf3 = new DecimalFormat();// 默认格式
		nbf3.setGroupingUsed(false);
		nbf3.setRoundingMode(RoundingMode.FLOOR);
		nbf3.setMinimumFractionDigits(points);
		nbf3.setMaximumFractionDigits(points);
		double scaledNum = divide(number, scale);
		result = nbf3.format(scaledNum);
		if (flag)
		{
			result = "-" + result;
		}
		return result;
	}
	
	/**
	 * @描述：不进行四舍五入保留小数位数
	 * @作者：包新钊
	 * @时间：2016年12月26日 下午10:24:27
	 * @param number 初始值
	 * @param scale 左右移小数点位数，例如（100，10，1，0.1），大于1左移，小于1右移，1不动
	 * @param points 保留小数位数
	 * @return
	 */
	public static double scaleNumberToDouble(double number, double scale, int points)
	{
		String result = scaleNumberToStr(number, scale, points);
		return Double.valueOf(result);
	}

}
